/*
 * 策略模式: 定义算法簇，分别封装起来，让它们可以互相替换，从而让算法的变化独立于使用算法的客户。
 *
 * 设计原则: 找出应用中可能需要变化之处，把它们独立出来，不要和那些不需要变化的代码混在一起。
 * 设计原则: 针对接口编程。
 * 设计原则: 多用组合，少用继承。
 * 
 * example context: 数据报告外发，目前方式有 email（仅工程师或群发） 短信（仅工程师或群发），有增加别的方式的可能
 *                外发的方式目前由时间和报告状态控制，工作日数据正常 email群发，否则email给工程师；周日数据正常 短信群发，否则短信工程师
 *
 */

package headfirst.strategy;


public class HFStrategy
{	
	public static void main(String[] args)
	{
		System.out.println("in HFStrategy");
		
		LogReporter thelogreporter = new LogReporter();
		
		//* strategy test
		thelogreporter.setSend(new MsgSendByMailAll("set mail all sender"));	
		thelogreporter.doReportSend();
		thelogreporter.setSend(new MsgSendByMailCore("set mail core sender"));	
		thelogreporter.doReportSend();
		thelogreporter.setSend(new MsgSendBySmsAll("set sms all sender"));	
		thelogreporter.doReportSend();
		thelogreporter.setSend(new MsgSendBySmsCore("set sms core sender"));	
		thelogreporter.doReportSend();
		//*/

		if(!thelogreporter.doLogRead())
		{
			thelogreporter.setSend(new MsgSendBySmsCore("log read error"));
		}
		else if(!thelogreporter.doLogCount())
		{
			thelogreporter.setSend(new MsgSendByMailCore("log count error"));
		}
		else
		{
			 thelogreporter.setSend(new MsgSendByMailAll("log count succ"));
		}
		thelogreporter.doReportSend();
	}
}
